package org.example.service.impl;

import lombok.Data;
import lombok.ToString;
import org.example.dao.UserDao;
import org.example.dao.impl.UserDaoImplForMysql;
import org.example.entity.User;
import org.example.service.UserService;
import org.springframework.beans.BeanUtils;
import org.springframework.context.annotation.Bean;

/**
 * org.example.service.impl
 *  spring主要就是IoC和AOP的容器
 *  spring core（就是IoC）
 *  八大模块：spring core    spring核心模块，实现了IoC思想
 *          spring aop     面向切面编程
 *          spring web mvc  spring自己提供的一套mvc框架
 *          spring webflux  spring提供的响应式web框架
 *          spring web      支持集成常见的web框架（struts、webwork。。。。）
 *          spring dao      spring提供的单独支持jdbc操作的api（基本没人使用）
 *          spring orm      支持集成常见的ORM框架（Mybatis、Hibernate。。。）
 *          spring context  提供国际化支持（i18n）、事件传播、验证支持、企业服务、velocity和freeMarker集成的支持
 *
 *  ssm：spring、springMVC、Mybatis
 *
 *  ocp（开闭原则）:
 *      软件七大开发原则中最基本的一个原则：开闭原则
 *      对扩展开放，对修改关闭
 *
 *  DIP（依赖倒置原则）：面向接口编程，面向抽象编程
 *
 *  IoC（控制反转，一种思想）：不在程序中使用硬编码方式创建对象
 *          不在程序中使用硬编码的方式维护对象的关系
 *          重要的实现方式：依赖注入（Dependency Injection 简称DI）
 *              DI：set注入和构造方法注入
 *                  D: A对象和B对象的关系
 *                  I: 一种手段，通过这种手段可以让A和B产生关系
 *
 * @author moLei
 * @description
 * @date 2025/7/18
 */
@Data
public class UserServiceImpl implements UserService {

    /**
     * 这里指定了具体的实现类，不符合依赖倒置原则，且如果更换数据库就需要修改源代码
     */
    UserDao userDao;

    /**
     * 调整，不在源代码中指定，使用接口去接收
     */
    int a;

    /**
     * 在上层用户调用时在去指定他需要使用什么数据库，这样如果底层数据库修改了，在service层的代码也不用调整，符合依赖倒置原则和ocp原则，降低了耦合度
     * 符合IoC（控制反转）,不使用硬编码去维护对象关系，使用spring的容器去控制。spring是实现了IoC思想的容器
     // * @param userDao
     */
    // public void setUserDao(UserDao userDao) {
    //     this.userDao = userDao;
    // }

    @Override
    public void save(User user) {
        userDao.save(user);
    }

    @Override
    public User findByUsername(String username) {
        return userDao.findById(username);
    }
}
